﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Xml;
using Cartography.Desktop;

namespace Cartography.Desktop
{
    public class BuildingsGroup
    {
        string name;
        int zoom;
        bool visible;
        XmlDocument doc;
        string pathData;
        List<classEdificiosSantiago> visibles;
        public BuildingsGroup(string file,bool visible) {
            doc = new XmlDocument();
            visibles = new List<classEdificiosSantiago>(20);
            this.visible = visible;
            doc.Load(file);
            int hasta=file.IndexOf("PointsOfInterest");
            pathData = file.Substring(0, hasta);

            this.name = doc.SelectSingleNode("/PointsOfInterest/Name").InnerText;
            try
            {
                this.zoom = int.Parse(doc.SelectSingleNode("/PointsOfInterest/Zoom").InnerText);
            }
            catch (Exception) {
                this.zoom = 0;
            }
        }
        public BuildingsGroup(XmlDocument file,  bool visible)
        {
            doc = file;
            visibles = new List<classEdificiosSantiago>(20);
            this.visible = visible;
            this.name = doc.SelectSingleNode("/PointsOfInterest/Name").InnerText;
            try
            {
                this.zoom = int.Parse(doc.SelectSingleNode("/PointsOfInterest/Zoom").InnerText);
            }
            catch (Exception)
            {
                this.zoom = 0;
            }
        }
        public void update(LatLon northWest, LatLon southEast) {
            visibles.Clear();
            try
            {
                System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
                string consulta = "/PointsOfInterest/Edificios/Edificio[Centroide/Latitud<" + northWest.Latitude.ToString(nfi) + " and Centroide/Longitud>" + northWest.Longitude.ToString(nfi) + " and Centroide/Latitud>" + southEast.Latitude.ToString(nfi) + " and  Centroide/Longitud<" + southEast.Longitude.ToString(nfi) + "]";
                XmlNodeList edificiosVisibles = doc.SelectNodes(consulta);
                for (int i = 0; i < edificiosVisibles.Count; i++)
                {
                    string Nombre = edificiosVisibles[i].SelectSingleNode("Nombre") == null ? this.name : edificiosVisibles[i].SelectSingleNode("Nombre").InnerText;
                    string Direccion = edificiosVisibles[i].SelectSingleNode("Direccion") == null ? "" : edificiosVisibles[i].SelectSingleNode("Direccion").InnerText;
                    string Comuna = edificiosVisibles[i].SelectSingleNode("Comuna") == null ? "" : edificiosVisibles[i].SelectSingleNode("Comuna").InnerText;
                    string Altura = edificiosVisibles[i].SelectSingleNode("Altura") == null ? "" : edificiosVisibles[i].SelectSingleNode("Altura").InnerText;
                    string Pisos = edificiosVisibles[i].SelectSingleNode("Pisos") == null ? "" : edificiosVisibles[i].SelectSingleNode("Pisos").InnerText;
                    string Habitantes = edificiosVisibles[i].SelectSingleNode("Habitantes") == null ? "" : edificiosVisibles[i].SelectSingleNode("Habitantes").InnerText;
                    LatLon redSeca = new LatLon();
                    redSeca.Latitude = edificiosVisibles[i].SelectSingleNode("RedSeca/Latitud").InnerText == "" ? 0 : double.Parse(edificiosVisibles[i].SelectSingleNode("RedSeca/Latitud").InnerText, nfi);
                    redSeca.Longitude = edificiosVisibles[i].SelectSingleNode("RedSeca/Longitud").InnerText == "" ? 0 : double.Parse(edificiosVisibles[i].SelectSingleNode("RedSeca/Longitud").InnerText, nfi);

                    LatLon viaEvacuacion = new LatLon();
                    viaEvacuacion.Latitude = edificiosVisibles[i].SelectSingleNode("ViaEvacuacion/Latitud").InnerText == "" ? 0 : double.Parse(edificiosVisibles[i].SelectSingleNode("ViaEvacuacion/Latitud").InnerText, nfi);
                    viaEvacuacion.Longitude = edificiosVisibles[i].SelectSingleNode("ViaEvacuacion/Longitud").InnerText == "" ? 0 : double.Parse(edificiosVisibles[i].SelectSingleNode("ViaEvacuacion/Longitud").InnerText, nfi);

                    LatLon redInerte = new LatLon();
                    redInerte.Latitude = edificiosVisibles[i].SelectSingleNode("RedInerte/Latitud").InnerText == "" ? 0 : double.Parse(edificiosVisibles[i].SelectSingleNode("RedInerte/Latitud").InnerText, nfi);
                    redInerte.Longitude = edificiosVisibles[i].SelectSingleNode("RedInerte/Longitud").InnerText == "" ? 0 : double.Parse(edificiosVisibles[i].SelectSingleNode("RedInerte/Longitud").InnerText, nfi);

                    XmlNodeList Vertices = edificiosVisibles[i].SelectNodes("Vertices/Vertice");
                    LatLon[] coordenadas = new LatLon[Vertices.Count];
                    for (int j = 0; j<Vertices.Count; j++) 
                    {
                        coordenadas[j] = new LatLon(double.Parse(Vertices[j].SelectSingleNode("Latitud").InnerText,nfi),double.Parse(Vertices[j].SelectSingleNode("Longitud").InnerText,nfi));
                    }
                    classEdificiosSantiago edificio = new classEdificiosSantiago(Nombre, Direccion, Comuna, Altura, Pisos, Habitantes,
                        coordenadas, zoom, redSeca, redInerte, viaEvacuacion, pathData);
                        visibles.Add(edificio);
                }
            }
            catch (Exception) {}
        }
        public bool Visible
        {
            get { return this.visible; }
            set { this.visible = value; }
        }
        public string Name
        {
            get { return this.name; }
        }
        public int Zoom
        {
            get { return this.zoom; }
            set { this.zoom = value; }
        }
        public XmlDocument Xml
        {
            get { return this.doc; }
            set { this.doc = value; }
        }
        public List<classEdificiosSantiago> visiblePoints
        {
            get { return this.visibles; }
        }
    }
}
